header%20ipynb.png

Hands-On


Hands-On ini digunakan pada kegiatan Microcredential Associate Data Scientist 2021

Tugas Mandiri Pertemuan 16


Pertemuan 16 (enambelas) pada Microcredential Associate Data Scientist 2021 menyampaikan materi mengenai Membangun model: Evaluasi. silakan Anda kerjakan Latihan 1 s/d 5. Output yang anda lihat merupakan panduan yang dapat Anda ikuti dalam penulisan code :)

Soal 1: Pemahaman Tentang Model Evaluasi

Jawab pertanyaan di bawah ini dengan bahasa masing-masing?

  1. Apa perbedaan antara data latih, data validasi, dan data test?
  2. Bagaimana cara kita menilai performa suatu model?
  3. Apa itu Confusion Matrix? Jelaskan secara lengkap!
  4. Apa itu Classification Report dari sklearn?

Jawab:

1. Data latih merupakan data yang digunakan untuk melatih model, data validasi merupakan data yang digunakan untuk proses validasi dan mencegah overfitting, dan data test merupakan data yang digunakan untuk testing model yang sudah dibuat.

2. Salah satu cara untuk menilai peforma dari suatu model adalah dengan menggunakan Confusion Matrix.

3. Confusion matrix juga sering disebut error matrix. Pada dasarnya confusion matrix memberikan informasi perbandingan hasil klasifikasi yang dilakukan oleh sistem (model) dengan hasil klasifikasi sebenarnya. Confusion matrix berbentuk tabel matriks yang menggambarkan kinerja model klasifikasi pada serangkaian data uji yang nilai sebenarnya diketahui.

4. Classification Report adalah library yang digunakan untuk mengukur kualitas dari prediksi sebuah algoritma klasifikasi. Dimana ia akan memprediksi seberapa banyak True dan False yang terdata.


Soal 2: Aplikasi Model Evaluasi

Kali ini kita akan menggunakan data untuk memprediksi kelangsungan hidup pasien yang telah mengalami operasi payudara. Dengan informasi yang dimiliki terkait pasien, kita akan membuat model untuk memprediksi apakah pasien akan bertahan hidup dalam waktu lebih dari 5 tahun atau tidak.

Lebih Lengkapnya kalian bisa membaca informasi tentang dataset di link berikut: https://raw.githubusercontent.com/jbrownlee/Datasets/master/haberman.names

Buat model Klasifikasi (Model/Algoritma Bebas) untuk memprediksi status pasien dengan ketentuan sebagai berikut:

  1. Bagi kedua data ini menjadi data training dan data test dengan test_size=0.25.
  2. Pelajar tentang metrics roc_auc_score kemudian buatlah model dan evaluasi dengan menggunakan teknik cross-validation dengan scoring 'roc_auc'. Baca https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html untuk menggunakan metric roc_auc saat cross-validation.
  3. Berapa score rata2 dari model dengan teknik cross-validation tersebut?
  4. Prediksi data test dengan model yang telah kalian buat!
  5. Bagaimana hasil confusion matrix dari hasil prediksi tersebut?
  6. Bagaimana classification report dari hasil prediksi tersebut?
  7. Seberapa baik model anda dalam memprediksi seorang pasien mempunyai status positive?
  8. Seberapa baik model anda dalam memprediksi seorang pasien mempunyai status negatif?

Load Dataset

In [1]:
# import library pandas
import pandas as pd

# Load Dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/haberman.csv'
list_cols = ['Age', "Patient's Years", "N_positive_ax", "survival_status"]
df = pd.read_csv(url, names=list_cols)
In [2]:
# tampilkan 5 baris awal dataset dengan function head()
df.head()
Out[2]:
Age Patient's Years N_positive_ax survival_status
0 30 64 1 1
1 30 62 3 1
2 30 65 0 1
3 31 59 2 1
4 31 65 4 1
In [3]:
# hitung jumlah masing" data pada kolom survival_status
df['survival_status'].value_counts()
Out[3]:
1    225
2     81
Name: survival_status, dtype: int64

Build Model

In [7]:
#import library train test split dan cross val
from sklearn.model_selection import train_test_split, cross_val_score

#import library Logistic regression
from sklearn.linear_model import LogisticRegression

#import library roc auc score
from sklearn.metrics import roc_auc_score

#import library scale
from sklearn.preprocessing import scale

#import library numpy
import numpy as np
In [8]:
## pemisahan feature dan target (data target : 'survival_status')
X = df.drop('survival_status', axis = 1)
Xs = scale(X)
y = df['survival_status']

NO 1

In [11]:
## pemisahan variabel test dan train dari data Xs dan y
# test size= 25%, random state = 42, dan stratify = y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y)
In [12]:
## pembuatan objek model
model_logReg = LogisticRegression(random_state = 42)

## latih model
model_logReg.fit(X_train, y_train)

## prediksi.
y_predict = model_logReg.predict(X_test)

NO 2

In [13]:
## menghitung cross_val_score dengan scoring = 'roc_auc'
## parameter cv = 10 
score = cross_val_score(model_logReg, X, y, scoring = 'roc_auc', cv = 10)
print(score)
[0.44021739 0.80978261 0.67391304 0.69021739 0.70380435 0.79292929
 0.875      0.62784091 0.67613636 0.61363636]

NO 3

In [14]:
# cetak rata-rata nilai rata-rata auc score
score.mean()
Out[14]:
0.6903477711901624

NO 4

In [15]:
# Prediksi data test dengan model yang telah kalian buat 
auc_score = roc_auc_score(y_test, y_predict)
auc_score
Out[15]:
0.5311403508771929

NO 5

In [16]:
# import library confusion matrix dan classification report
from sklearn.metrics import confusion_matrix, classification_report
In [32]:
# apply confusion matrix dan cetak nilai confusion matrix
cm = confusion_matrix(y_test, y_predict, labels = (1,2))
cm 
Out[32]:
array([[52,  5],
       [17,  3]], dtype=int64)
In [33]:
# visualisasikan nilai confusion matrix ke dalam diagram heatmap
import seaborn as sns
sns.heatmap(pd.DataFrame(cm),annot=True)
Out[33]:
<AxesSubplot:>

NO 6

In [38]:
# cetak nilai classification_report
print(classification_report(y_test, y_predict, target_names=['class 0', 'class 1']))
              precision    recall  f1-score   support

     class 0       0.75      0.91      0.83        57
     class 1       0.38      0.15      0.21        20

    accuracy                           0.71        77
   macro avg       0.56      0.53      0.52        77
weighted avg       0.66      0.71      0.67        77

NO 7

  • Bagaimana hasil confusion matrix dari hasil prediksi tersebut?

    (TP) Ada 3 data yang diprediksi tepat selamat (survival_status = 1) (FP) Ada 17 data yang diprediksi tidak tepat selamat (survival_status = 0) (TN) Ada 5 data yang diprediksi tidak tepat tidak selamat (survival_status = 1) (FN) ada 52 data yang diprediksi tepat tidak selamat (survival_status = 0)

  • Bagaimana classification report dari hasil prediksi tersebut?
    akurasi 71% recall 15% pressi 38% f1 21%

  • Seberapa baik model anda dalam memprediksi seorang pasien mempunyai status positive? dari hasil classification_report diatas
    model masih belum dapat memprediksi dengan baik pasien yang memiliki status positive dengan nilai presisi pada prediksi (class1) yang bernilai 15%

  • Seberapa baik model anda dalam memprediksi seorang pasien mempunyai status negatif? dari hasil classification_report diatas

    52 / ( 52+17) = 0.75, artinya 75% model dapat memprediksi status negatif lebih baik dibandingkan dengan status positifnya.


Soal 3: Pemahaman Tentang Model Selection

Jelaskan dengan bahasa sendiri!

  1. Apa itu Bias dan Variance?
  2. Apa itu Overfitting dan Underfitting?
  3. Apa yang bisa kita lakukan untuk mengatur kompleksitas dari model?
  4. Bagaimana model yang baik?
  5. Kapan kita menggunakan GridSearchcv dan kapan menggunakan RandomizedSearchCV?

Jawab:

1. Bias adalah suatu perbedaan antara rata-rata hasil prediksi dari mdel yang dikembangkan dengan nilai sebenarnya. Variance adalah variabel dari model prediksi untuk data tertentu dengan memberikan infromasi persebaran data.

2. Overfitting adalah kondisi dimana data memiliki bias dan variance yang tinggi sehingga hasil prediksi memiliki akurasi yang rendah, karena model hanya mempelajari berdasarkan data yang ada dan ketika diberikan data baru model tidak dapat memprediksinya dengan benar. Underfitting adalah kondisi dimana bias tinggi dan variance rendah, kondisi ini terjadi ketika model kurang mendapatkan data yang cukup, sehingga ia tidak dapat memprediksi dengan baik sama sekali.

3. Dengan memperhatikan overfitting/underfitting pada model.

4. Model yang dapat memprediksi nilai dari algoritma yang diguanakan, model yang memiliki best score yang baik.

5. Kita menggunakan GridSearchCV ketika menggunakan parameter yang sudah dites, sementara RandomizedSearchCV ketika kita menggunakan model tanpa parameter yang sudah dites.


Soal 4: Aplikasi Model Selection

  1. Bagi kedua data berikut ini menjadi data training dan data test dengan test_size=0.25.
  2. Import library KNN dan GridSearchCV.
  3. Gunakan algoritma KNN dan fungsi GridSearchCV untuk hyperparameter tuning dan model selection.
  4. jumlah fold bebas!, gunakan scoring 'roc_auc'
  5. Definisikan kombinasi hyperparameter untuk model selection dengan GridSearchCV. kombinasi Hyperparameter bebas, baca lagi dokumentasi KNN di link berikut https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html untuk memahami lagi jenis2 hyperparameter di algorithma KNN.
  6. Latih model terhadap data training.
  7. Apa hyperparameter terbaik untuk kombinasi hyperparameter kalian?
  8. Berapa score validasi terbaik dari model tersebut?
  9. Prediksi probabilitasi output dari model yang telah di buat terhadap data test. note : gunakan method .predict_proba() untuk menghasilkan output probabilitas

  10. Berapa nilai score roc_auc untuk data test? (y_predict)

  11. Apakah model anda termasuk baik, overtting, atau underfitting?

Load Dataset

In [39]:
# import library pandas
import pandas as pd

# Load Dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/haberman.csv'
list_cols = ['Age', "Patient's Years", "N_positive_ax", "survival_status"]
df2 = pd.read_csv(url, names=list_cols)
In [40]:
# tampilkan 5 baris awal dataset dengan function head()
df2.head()
Out[40]:
Age Patient's Years N_positive_ax survival_status
0 30 64 1 1
1 30 62 3 1
2 30 65 0 1
3 31 59 2 1
4 31 65 4 1
In [41]:
# hitung jumlah masing" data pada kolom survival_status
df2['survival_status'].value_counts()
Out[41]:
1    225
2     81
Name: survival_status, dtype: int64

NO 1

In [42]:
# 1. pembagian variabel train dan test
# test size= 25%, random state = 42, dan stratify = y
X = df2.drop('survival_status', axis = 1)
y = df2['survival_status']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y)

NO 2

In [62]:
# 2. import library KNN dan GridSearchCv
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

NO 3 - 6

In [69]:
# 3. tuning hyperparameter dengan GridSearchCV (parameter cv=10)
## build model KNN
model_knn = KNeighborsClassifier()
param_grid = {'n_neighbors' : np.arange(3,51), 'weights' : ['uniform','distance']}
gscv = GridSearchCV(model_knn, param_grid, scoring='roc_auc', cv = 10)
gscv.fit(X_train, y_train)
Out[69]:
GridSearchCV(cv=10, estimator=KNeighborsClassifier(),
             param_grid={'n_neighbors': array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
       20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
       37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]),
                         'weights': ['uniform', 'distance']},
             scoring='roc_auc')

NO 7

In [70]:
# 7. parameter terbaik
gscv.best_params_
Out[70]:
{'n_neighbors': 42, 'weights': 'distance'}

NO 8

In [71]:
# 8. score validasi terbaik
gscv.best_score_
Out[71]:
0.7289653361344539

NO 9

In [72]:
# 9. prediksikan probabilitas masing-masing data test
y_predict = gscv.predict_proba(X_test)
y_predict
Out[72]:
array([[0.84295141, 0.15704859],
       [0.82515143, 0.17484857],
       [0.84450303, 0.15549697],
       [0.8829303 , 0.1170697 ],
       [0.78768014, 0.21231986],
       [0.86606386, 0.13393614],
       [1.        , 0.        ],
       [0.90868504, 0.09131496],
       [1.        , 0.        ],
       [0.42120617, 0.57879383],
       [0.74095964, 0.25904036],
       [0.85479207, 0.14520793],
       [0.73829794, 0.26170206],
       [0.37526962, 0.62473038],
       [0.87229067, 0.12770933],
       [0.84014718, 0.15985282],
       [0.81321218, 0.18678782],
       [0.87071492, 0.12928508],
       [0.81522656, 0.18477344],
       [0.52782658, 0.47217342],
       [0.76729919, 0.23270081],
       [0.81414816, 0.18585184],
       [1.        , 0.        ],
       [0.87394022, 0.12605978],
       [0.4819789 , 0.5180211 ],
       [0.43393938, 0.56606062],
       [0.5599323 , 0.4400677 ],
       [1.        , 0.        ],
       [0.81014602, 0.18985398],
       [0.94114044, 0.05885956],
       [1.        , 0.        ],
       [0.87229067, 0.12770933],
       [1.        , 0.        ],
       [0.66522891, 0.33477109],
       [0.82450396, 0.17549604],
       [1.        , 0.        ],
       [0.92420407, 0.07579593],
       [0.84512939, 0.15487061],
       [0.64189706, 0.35810294],
       [0.70638658, 0.29361342],
       [0.86153775, 0.13846225],
       [0.66066079, 0.33933921],
       [0.71316187, 0.28683813],
       [0.3356734 , 0.6643266 ],
       [0.86069631, 0.13930369],
       [0.87243295, 0.12756705],
       [0.86198796, 0.13801204],
       [1.        , 0.        ],
       [0.8519248 , 0.1480752 ],
       [0.80928241, 0.19071759],
       [0.        , 1.        ],
       [0.58967952, 0.41032048],
       [0.80539434, 0.19460566],
       [0.82285637, 0.17714363],
       [0.95394369, 0.04605631],
       [0.7950693 , 0.2049307 ],
       [0.58475437, 0.41524563],
       [0.85434209, 0.14565791],
       [0.86461118, 0.13538882],
       [0.85289258, 0.14710742],
       [0.78683244, 0.21316756],
       [0.81522656, 0.18477344],
       [0.86017756, 0.13982244],
       [0.87339434, 0.12660566],
       [0.79994712, 0.20005288],
       [1.        , 0.        ],
       [0.61453516, 0.38546484],
       [0.78769197, 0.21230803],
       [0.39596301, 0.60403699],
       [0.7516005 , 0.2483995 ],
       [0.86463061, 0.13536939],
       [0.65377416, 0.34622584],
       [0.80578569, 0.19421431],
       [0.92685118, 0.07314882],
       [0.78581751, 0.21418249],
       [0.7599124 , 0.2400876 ],
       [0.86935602, 0.13064398]])
In [74]:
# nilai rata-rata probabilitas data test
y_predict.mean()
Out[74]:
0.5

NO 10

In [77]:
# 10. nilai score roc_auc 
kurang_5th = y_predict[:,1]
print(kurang_5th)
[0.15704859 0.17484857 0.15549697 0.1170697  0.21231986 0.13393614
 0.         0.09131496 0.         0.57879383 0.25904036 0.14520793
 0.26170206 0.62473038 0.12770933 0.15985282 0.18678782 0.12928508
 0.18477344 0.47217342 0.23270081 0.18585184 0.         0.12605978
 0.5180211  0.56606062 0.4400677  0.         0.18985398 0.05885956
 0.         0.12770933 0.         0.33477109 0.17549604 0.
 0.07579593 0.15487061 0.35810294 0.29361342 0.13846225 0.33933921
 0.28683813 0.6643266  0.13930369 0.12756705 0.13801204 0.
 0.1480752  0.19071759 1.         0.41032048 0.19460566 0.17714363
 0.04605631 0.2049307  0.41524563 0.14565791 0.13538882 0.14710742
 0.21316756 0.18477344 0.13982244 0.12660566 0.20005288 0.
 0.38546484 0.21230803 0.60403699 0.2483995  0.13536939 0.34622584
 0.19421431 0.07314882 0.21418249 0.2400876  0.13064398]

NO 11 Apakah model anda termasuk baik, overtting, atau underfitting?

Jawab

underfitting

Soal 5:

  1. Ulangi tahap di atas (soal 4, no 1 - 8) namun kali ini menggunakan algoritma DecisionTreeClassifier dan kalian bisa menggunakan RandomizedSearchCV apabila process training lama. pelajari algoritma DecisionTreeClassifier di linkberikut: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html?highlight=decisiontreeclassifier#sklearn.tree.DecisionTreeClassifier
  2. Bandingkan scorenya dengan Algoritma KNN, mana yang lebih baik?

Note : Data Science adalah experiment, sangat di dimungkinkan memerlukan beberapa kali percobaan untuk mendapatkan hasil yang terbaik! Happy Coding :)

NO 1

In [78]:
# 1. import algoritma DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
In [79]:
# Build model decision tree classifier 
model_tree = DecisionTreeClassifier()
params = {'criterion' : ['entropy','gini'], 'splitter' : ['best', 'random'],
         'min_samples_split' : np.arange(2,50)}
gscv = GridSearchCV(model_tree, param_grid = params, cv = 10, scoring = 'roc_auc')
gscv.fit(X_train, y_train)
Out[79]:
GridSearchCV(cv=10, estimator=DecisionTreeClassifier(),
             param_grid={'criterion': ['entropy', 'gini'],
                         'min_samples_split': array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
       19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
       36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]),
                         'splitter': ['best', 'random']},
             scoring='roc_auc')
In [80]:
# parameter terbaik
gscv.best_params_
Out[80]:
{'criterion': 'gini', 'min_samples_split': 36, 'splitter': 'random'}
In [81]:
# score validasi terbaik
gscv.best_score_
Out[81]:
0.7449492296918767

NO 2

Jawab

yang lebih baik adalah Decision Tree, dikarenakan best scorenya yang lebih tinggi jika dibandingkan dengan KNN.